From ae3fdffcb78a23d53cd2bafde29c217f075be00a Mon Sep 17 00:00:00 2001 From: "cl349@freefall.cl.cam.ac.uk" Date: Fri, 6 Aug 2004 13:25:19 +0000 Subject: [PATCH] bitkeeper revision 1.1149.2.3 (411386bfYp4SwvBgrsGPfuJ_1XU5xw) Enable pcibios_scan_all_fns since otherwise we don't find all multifunction devices. --- .rootkeys | 1 + .../include/asm-xen/asm-i386/pci.h | 117 ++++++++++++++++++ xen/common/physdev.c | 14 ++- 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pci.h diff --git a/.rootkeys b/.rootkeys index 37439eac28..41716c6936 100644 --- a/.rootkeys +++ b/.rootkeys @@ -217,6 +217,7 @@ 40f5623aFTyFTR-vdiA-KaGxk5JOKQ linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/msr.h 40f5623adgjZq9nAgCt0IXdWl7udSA linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/page.h 40f5623a54NuG-7qHihGYmw4wWQnMA linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/param.h +41137cc1kkvg0cg7uxddcEfjL7L67w linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pci.h 40f5623atCokYc2uCysSJ8jFO8TEsw linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pgalloc.h 40f5623aEToIXouJgO-ao5d5pcEt1w linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h 40f5623aCCXRPlGpNthVXstGz9ZV3A linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pgtable.h diff --git a/linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pci.h b/linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pci.h new file mode 100644 index 0000000000..32d08ada26 --- /dev/null +++ b/linux-2.6.7-xen-sparse/include/asm-xen/asm-i386/pci.h @@ -0,0 +1,117 @@ +#ifndef __i386_PCI_H +#define __i386_PCI_H + +#include + +#ifdef __KERNEL__ +#include /* for struct page */ + +/* Can be used to override the logic in pci_scan_bus for skipping + already-configured bus numbers - to be used for buggy BIOSes + or architectures with incomplete PCI setup by the loader */ + +#ifdef CONFIG_PCI +extern unsigned int pcibios_assign_all_busses(void); +#else +#define pcibios_assign_all_busses() 0 +#endif +#define pcibios_scan_all_fns(a, b) 0 + +extern unsigned long pci_mem_start; +#define PCIBIOS_MIN_IO 0x1000 +#define PCIBIOS_MIN_MEM (pci_mem_start) + +#define PCIBIOS_MIN_CARDBUS_IO 0x4000 + +void pcibios_config_init(void); +struct pci_bus * pcibios_scan_root(int bus); + +void pcibios_set_master(struct pci_dev *dev); +void pcibios_penalize_isa_irq(int irq); +struct irq_routing_table *pcibios_get_irq_routing_table(void); +int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq); + +/* Dynamic DMA mapping stuff. + * i386 has everything mapped statically. + */ + +#include +#include +#include +#include +#include + +struct pci_dev; + +/* The PCI address space does equal the physical memory + * address space. The networking and block device layers use + * this boolean for bounce buffer decisions. + */ +#define PCI_DMA_BUS_IS_PHYS (1) + +/* pci_unmap_{page,single} is a nop so... */ +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) +#define pci_unmap_addr(PTR, ADDR_NAME) (0) +#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) +#define pci_unmap_len(PTR, LEN_NAME) (0) +#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) + +/* This is always fine. */ +#define pci_dac_dma_supported(pci_dev, mask) (1) + +static inline dma64_addr_t +pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page, unsigned long offset, int direction) +{ + return ((dma64_addr_t) page_to_phys(page) + + (dma64_addr_t) offset); +} + +static inline struct page * +pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr) +{ + return pfn_to_page(dma_addr >> PAGE_SHIFT); +} + +static inline unsigned long +pci_dac_dma_to_offset(struct pci_dev *pdev, dma64_addr_t dma_addr) +{ + return (dma_addr & ~PAGE_MASK); +} + +static inline void +pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction) +{ +} + +static inline void +pci_dac_dma_sync_single_for_device(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction) +{ + flush_write_buffers(); +} + +#define HAVE_PCI_MMAP +extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, + enum pci_mmap_state mmap_state, int write_combine); + + +static inline void pcibios_add_platform_entries(struct pci_dev *dev) +{ +} + +#endif /* __KERNEL__ */ + +/* implement the pci_ DMA API in terms of the generic device dma_ one */ +#include + +/* generic pci stuff */ +#include + +/* On Xen we have to scan all functions since Xen hides bridges from + * us. If a bridge is at fn=0 and that slot has a multifunction + * device, we won't find the additional devices without scanning all + * functions. */ +#undef pcibios_scan_all_fns +#define pcibios_scan_all_fns(a, b) 1 + +#endif /* __i386_PCI_H */ diff --git a/xen/common/physdev.c b/xen/common/physdev.c index e76b72b56f..41218753ee 100644 --- a/xen/common/physdev.c +++ b/xen/common/physdev.c @@ -734,7 +734,19 @@ void physdev_init_dom0(struct domain *p) continue; } - /* Skip bridges and other peculiarities for now. */ + /* Skip bridges and other peculiarities for now. + * + * Note that this can prevent the guest from detecting devices + * with fn>0 on slots where the fn=0 device is a bridge. We + * can identify such slots by looking at the multifunction bit + * (top bit of hdr_type, masked out in dev->hdr_type). + * + * In Linux2.4 we find all devices because the detection code + * scans all functions if the read of the fn=0 device's header + * type fails. + * + * In Linux2.6 we set pcibios_scan_all_fns(). + */ if ( dev->hdr_type != PCI_HEADER_TYPE_NORMAL ) continue; pdev = xmalloc(sizeof(phys_dev_t)); -- 2.30.2